]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
appDisplay: Add timeout for mouse scrolling
authorAlexander Mikhaylenko <alexm@gnome.org>
Wed, 16 Oct 2019 07:30:14 +0000 (12:30 +0500)
committerFlorian Müllner <fmuellner@gnome.org>
Wed, 8 Jan 2020 22:41:49 +0000 (23:41 +0100)
Prevent uncontrollably fast scrolling. Use the same duration as switching
animation, but add a separate timeout to account for disabled animations.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/1338

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/825

js/ui/appDisplay.js

index 05d0ab3a4a8d01bd388e2f4ae6c7bc2514928fe8..0156877e8fbb7edfcb10a1aafb100359db79acce 100644 (file)
@@ -376,6 +376,9 @@ var AllView = GObject.registerClass({
         this._displayingPopup = false;
         this._currentPopupDestroyId = 0;
 
+        this._canScroll = true; // limiting scrolling speed
+        this._scrollTimeoutId = 0;
+
         this._availWidth = 0;
         this._availHeight = 0;
 
@@ -406,6 +409,15 @@ var AllView = GObject.registerClass({
 
         Main.overview.connect('item-drag-begin', this._onDragBegin.bind(this));
         Main.overview.connect('item-drag-end', this._onDragEnd.bind(this));
+
+        this.connect('destroy', this._onDestroy.bind(this));
+    }
+
+    _onDestroy() {
+        if (this._scrollTimeoutId !== 0) {
+            GLib.source_remove(this._scrollTimeoutId);
+            this._scrollTimeoutId = 0;
+        }
     }
 
     vfunc_map() {
@@ -638,11 +650,25 @@ var AllView = GObject.registerClass({
         if (this._displayingPopup || !this._scrollView.reactive)
             return Clutter.EVENT_STOP;
 
+        if (!this._canScroll)
+            return Clutter.EVENT_STOP;
+
         let direction = event.get_scroll_direction();
         if (direction == Clutter.ScrollDirection.UP)
             this.goToPage(this._grid.currentPage - 1);
         else if (direction == Clutter.ScrollDirection.DOWN)
             this.goToPage(this._grid.currentPage + 1);
+        else
+            return Clutter.EVENT_STOP;
+
+        this._canScroll = false;
+        this._scrollTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
+            PAGE_SWITCH_TIME, () => {
+                this._canScroll = true;
+                this._scrollTimeoutId = 0;
+                return GLib.SOURCE_REMOVE;
+            }
+        );
 
         return Clutter.EVENT_STOP;
     }